package com.my.juc.lock;

/**
 * @author zhupanlin
 * @version 1.0
 * @description: TODO
 * @date 2024/3/5 18:59
 */


/**
 * 产生死锁的原因：
 *  资源不足
 *  进程推进顺序不当
 *  
 *  产生死锁的四个必要条件
 *      1.互斥条件
 *      2.请求和保持条件
 *      3.不剥夺条件
 *      4.环路等待条件     
*   解决死锁的基本方法：
 *      1.预防死锁
 *      2.避免死锁
 *      3.检测死锁
 *      4.解除死锁
 *   验证是否死锁
 *   1.jps 查看当前正在运行的java进程
 *   2.jstack 查看堆栈信息
 */
public class DeadLock {
    
    // 创建两个对象
    static Object a = new Object();
    static Object b = new Object();

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (a){
                System.out.println(Thread.currentThread().getName() + " 持有锁a");
                synchronized (b){
                    System.out.println(Thread.currentThread().getName() + " 持有锁b");
                }
            }
        }, "t1").start();

        new Thread(() -> {
            synchronized (b){
                System.out.println(Thread.currentThread().getName() + " 持有锁b");
                synchronized (a){
                    System.out.println(Thread.currentThread().getName() + " 持有锁a");
                }
            }
        }, "t2").start();
    }
    
}
